package com.core.framework.db;

import java.util.List;

import com.core.framework.db.jdbc.page.Page;
/**
 * Dao接口   
 * @author 刘涛
 * @since Jun 19, 2012
 * @param <T>
 * @param <PK>
 */
public interface IDao<T,PK>  {
	/**
	 * 传入一条SQL语句  一个类对象 、 以及相关的查询条件等等 ，返回一个对象的List集合
	 * @param sql  SQL语句
	 * @param cla  类对象 
	 * @param objects 参数
	 * @return  List<Class<?>> 集合
	 */
	public List<?> getListBySql(String sql , Class<?> cla , Object ...objects);
	/**
	 * 获取当前对象List 
	 * @param sql SQL语句
	 * @param objects  查询参数
	 * @return
	 */
	public List<T> getList(String sql , Object ...objects);
	/**
	 * 获取当前对象List 通过主键ID 
	 * @param PK  主键
	 * @return
	 */
	public List<T> getList( PK pk);
	/**
	 * 传入一条SQL语句  一个类对象 、 以及相关的查询条件等等 ，返回一个对象的对象
	 * @param sql  SQL语句
	 * @param cla  类对象 
	 * @param objects 参数
	 * @return  Object
	 */
	public Object getObjectBySql (String sql , Class<?> cla,Object ...objects);
	/**
	 * 获取当前对象
	 * @param sql SQL 语句 
	 * @param key  主键ID
	 * @return  Object
	 */
	public T getObject (String sql ,Object ...objects);
	/**
	 * 获取当前对象  通过主键ID
	 * @param key  主键ID
	 * @return  Object
	 */
	public T getObject (PK key);
	/**
	 * 保存一个对象
	 * @param object
	 * @return 返回保存后的对象
	 */
	public T saveObject(T object);
	/**
	 * 保存一个对象
	 * @param object
	 * @return 返回保存后的对象
	 */
	public T saveObjectByAutoUUID(T object);
	/**
	 * 保存一组对象集合  暂时只提供的List的集合形式
		 * @param tList
	 */
	public void saveAll(List<T> tList);
	/**
	 * 修改一个对象 并返回该对象 都是通过主键来修改 
	 * @param object
	 * @return T 
	 */
	public T updateObject(T object );
	/**
	 * 批量修改数据  通过主键修改
	 */
	public void updateAll(List<T> tList);
	/**
	 * 修改记录通过传入的SQL语句
	 * @param sql SQL 语句 
	 * @param objects  对象参数  “修改条件”
	 * @return
	 */
	public T  updateObject(String sql , Object ...objects);
	/**
	 * 执行条SQL语句 用于除了查询业务以外的操作
	 * @param sql SQL 语句
	 * @param objects 参数
	 */
	public void excute(String sql , Object ...objects );
	/**
	 * 批量执行SQL
	 * @param sqls SQL 语句数组
	 */
	public void excute(String[] sqls );
	/**
	 * 分页查询  传入 Page参数  返回Page对象
	 * @param page  Page对象
	 * @return Page<T>
	 */
	public Page<T> findPage(Page<T> page);
	/**
	 * 分页查询  传入 Page参数  返回Page对象
	 * @param page  Page对象
	 * @param whereContent 查询条件
	 * @return Page<T>
	 */
	public Page<T> findPage(Page<T> page,String whereContent);
	/**
	 * 通过SQL语句查询得到统计数据信息
	 * @param sql SQL语句
	 * @param objects 参数对象
	 * @return 
	 */
	public Integer getInt(String sql ,Object ...objects);
	/**
	 * 删除一个对象  通过主键ID
	 * @param pk
	 */
	public void deleteObject(PK pk);
   /**
    * 获得主键值
    * @param obj
    * @return
    */
	public PK getPkValue(T obj);
}
